#pragma once

#include "../../inc/TopoDS/OMIT_MeshForwardDecl.h"

namespace OMIT_NAMESPACE
{
	template<typename Traits>
	class TEdge
    {
	public:
		using TV = MeshTraits_V<Traits>;
		using TE = MeshTraits_E<Traits>;
		using TF = MeshTraits_F<Traits>;
		using TH = MeshTraits_H<Traits>;

	public:
		TH* HalfEdge() noexcept { return _h; }
		const TH* HalfEdge() const noexcept { return const_cast<TEdge*>(this)->HalfEdge(); }

		void SetHalfEdge(TH* h) noexcept { _h = h; }
		void Reset() noexcept { _h = nullptr; }

        // 在边界上的边，一定有关联的一条半边在边界上（空指针）
		bool IsOnBoundary() const noexcept { return HalfEdge()->IsOnBoundary() || HalfEdge()->Pair()->IsOnBoundary(); }

        // 函数返回与当前边的两个端点邻接的所有半边
		std::vector<TH*> AdjOutHalfEdges();
        // 函数返回与当前边的两个端点邻接的所有半边
		std::vector<const TH*> AdjOutHalfEdges() const;

        // 函数返回与两个端点邻接的顶点集合
		std::set<TV*> AdjVertices();
        // 函数返回与两个端点邻接的顶点集合
		std::set<const TV*> AdjVertices() const;

        // 函数返回与当前边的两个顶点邻接的所有边
		std::vector<TE*> AdjEdges();
        // 函数返回与当前边的两个顶点邻接的所有边
		std::vector<const TE*> AdjEdges() const;

	private:
		friend TMesh<Traits>;
		bool IsFree() const noexcept { return HalfEdge()->IsFree() && HalfEdge()->Pair()->IsFree(); }

		TH* _h{ nullptr };
    };
}

#include "../../inc/TopoDS/OMIT_MeshEdge.inl"